package com.allwees.bs.core.modelbase.req;

import com.allwees.bs.core.modelbase.validate.ValidateItem;
import com.allwees.core.common.util.encrypt.MD5Util;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.StringUtils;

/**
 * 带参数签名的Req（需要校验参数是否被篡改）
 *
 * @author: yangylsky
 */
@Data
@EqualsAndHashCode(callSuper=true)
public abstract class SignedReq extends Req {
	private String signature;

	/**
	 * 参与签名的参数序列
	 *
	 * @return
	 */
	protected abstract Object[] signValues();

	/**
	 * 签名的参数分隔符
	 *
	 * @return
	 */
	protected String signSeparator() {
		return "|";
	}

	/**
	 * 是否忽略验证（某些场景下忽略验签）
	 *
	 * @return
	 */
	protected boolean ignoreValidate() {
		return false;
	}

	@Override
	public ValidateItem[] getValidateItems() {
		return new ValidateItem[] {
				ValidateItem.of(!ignoreValidate() && !isValidTime(getTime()), "参数[time]错误"),
				ValidateItem.of(!ignoreValidate() && StringUtils.isBlank(getSignature()), "参数[signature]错误")
			};
	}

	@Override
	public void afterValidate() {
		validateSignature();

		super.afterValidate();
	}

	final public void validateSignature() {
		if(ignoreValidate()) {
			return;
		}
		String signText = StringUtils.join(signValues(), signSeparator());
		if(!signature.equalsIgnoreCase(MD5Util.digest(signText))) {
			throw new SignatureException();
		}
	}
}
